/*
 * Licensed to the Tai Ping Jin Ke
 *
 * Copyright (c) 2022 .
 * All rights reserved.
 * 项目名称：太平金科-基础组件封装层-会话管理-核心依赖
 * 版权说明：本软件属太平金融科技服务(上海)有限公司所有，在未获得太平金融科技服务(上海)有限公司正式授权情况下，任何企业和个人，不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。
 */
package com.taipingframework.boot.session.constant;

import com.taipingframework.boot.cache.constant.DurationConstant;
import com.taipingframework.boot.cache.redis.ScenariosCachePath;

/**
 * 《项目中所有Redis-Key统一管理》
 * <p>
 * 全局业务Redis-Key命名空间设计
 * 如何保证Redis-Key的全局唯一性 ?设计redis-key需要从以下维度考虑:
 * 1、项目名，如 call-center
 * 2、模块名，如 platform
 * 3、项日运行环境，如 dev、sit、uat、pre、prd
 * 4、本地会话标识，如 session-id或者当前登录人标识user-id等
 *
 * @author 周孝兵
 * @since 2022-12-06
 */
public enum SessionCachePathEnum implements ScenariosCachePath {
    SESSION_CREDENTIALS_PATH("client-credentials", DurationConstant.MIN_45.seconds(), SessionConstant.SESSION_CACHE_KEY_GROUP, true),
    SESSION_UNEXPIRED_PATH("client-unexpired", DurationConstant.MIN_45.seconds(), SessionConstant.SESSION_CACHE_KEY_GROUP, true),
    SESSION_PROFILE_PATH("client-profile", DurationConstant.MIN_45.seconds(), SessionConstant.SESSION_CACHE_KEY_GROUP, true),
    SESSION_DATA_PATH("sessions", DurationConstant.MIN_45.seconds(), SessionConstant.SESSION_CACHE_KEY_GROUP, true),
    SESSION_EXPIRES_PATH("sessions:expires", DurationConstant.MIN_45.seconds(), SessionConstant.SESSION_CACHE_KEY_GROUP, true);

    /**
     * 枚举类构造器，
     * 我们约定：这种缓存对象存放在项目根目录的每个子工程目录下面，每个子工程只被允许访问当前子工程目录下面的缓存对象
     * 使用场景：分布式应用解决高并发场景下I/O阻塞的问题
     *
     * @param path      Redis-Key路径
     * @param expire    Redis-Key过期时长
     * @param isDiffEnv 是否区分项目运行环境
     */
    SessionCachePathEnum(String path, Long expire, Boolean isDiffEnv) {
        this(path, expire, null, isDiffEnv);
    }

    /**
     * 枚举类构造器，
     * 我们约定：这种缓存对象存放在项目根目录的共享分组目录下面，隶属于该项目的所有子工程可以访问。
     * 使用场景：分布式应用spring-session共享会话数据
     *
     * @param path      Redis-Key路径
     * @param expire    Redis-Key过期时长
     * @param group     将若干个 cache-key 单独归类为一个特别的分组 从而替换 `模块名`这个维度
     * @param isDiffEnv 是否区分项目运行环境
     */
    SessionCachePathEnum(String path, Long expire, String group, Boolean isDiffEnv) {
        this.path = path;
        this.expire = expire;
        this.group = group;
        this.isDiffEnv = isDiffEnv;
    }

    /**
     * redis-key
     */
    private final String path;
    /**
     * 过期时长(单位:秘)，-1表示永不过期
     */
    private final Long expire;
    /**
     * 将若干个 cache-key 单独归类为一个特别的`group分组` 从而替换 `模块名`这个维度
     */
    private final String group;
    /**
     * 是否区分项目运行环境: true- 区分，false- 不区分
     */
    private final Boolean isDiffEnv;

    /**
     * 获取全局唯一的Redis-Key，设计维度; 项目名称 + 模块名称 + 项目运行环境 + session唯一标识 + redis-key
     * <p>
     * 项目运行环境，如dev、sit、vat、pre、prd
     * 本地会话标识，也可以使用当前登录用户的唯一标识替代
     */
    @Override
    public String getCachePath() {
        return path;
    }

    @Override
    public Long getExpire() {
        return this.expire;
    }

    @Override
    public String getGroup() {
        return group;
    }

    @Override
    public Boolean getDiffEnv() {
        return this.isDiffEnv;
    }

}
